﻿/********************************************************************
	created:	2016/04/11
	created:	11:4:2016   21:59
	filename: 	E:\XuanwuCode\branches\branches_gns\XuanwuClient\AllGame\GnsClientFrame\Common\CollisionCalculate.h
	file path:	E:\XuanwuCode\branches\branches_gns\XuanwuClient\AllGame\GnsClientFrame\Common
	file base:	CollisionCalculate
	file ext:	h
	author:		hgj
	
	purpose:	常用的碰撞计算和几何公式计算，见  GeometricCalculation.h
*********************************************************************/

#ifndef  COLLISION_CALCULATE_H
#define  COLLISION_CALCULATE_H

#include "cocos2d.h"
using namespace cocos2d;

class CollisionCalculate
{
public:
	CollisionCalculate();
	~CollisionCalculate();

	
	// 另一种判断多边形顶点排列方向的方法      
	static bool isccwize(int vcount, Vec2 polygon[]);

	/* --------------------------------------------------------------------------
	函数说明：点与简单多边形的碰撞检测，顶点逆时针排列，射线法判断点q与多边形polygon的位置关系，要求polygon为简单多边形。
	传入参数：
			vcount		多边形的点的数量
			Polygon		多边形的点
			q					点
	返回值：
			如果点在多边形内：   返回0
			如果点在多边形边上： 返回1
			如果点在多边形外：    返回2
	-------------------------------------------------------------------------- */
	static int insidepolygon(int vcount, Vec2 Polygon[], Vec2 q);

	/* --------------------------------------------------------------------------
	函数说明：点与凸多边形的碰撞检测，注意：多边形 polygon 一定要是凸多边形      
	传入参数：
		vcount		多边形的点的数量
		Polygon		多边形的点，注意：多边形 polygon 一定要是凸多边形      
		q					点
	返回值：
		如果点在多边形内（包含在边框上）返回 true ，如果点在多边形外则返回 false
	-------------------------------------------------------------------------- */
	static bool InsideConvexPolygon(int vcount, Vec2 polygon[], Vec2 q);

	/* --------------------------------------------------------------------------
	函数说明：点与多边形的碰撞检测，推荐使用，注意：多边形可以不是简单多边形，可以不是凸多边形     
	传入参数：
			n					多边形的点的数量
			Polygon		多边形的点，注意：多边形 polygon 一定要是凸多边形
			point			点
	返回值：
			如果点在多边形内（包含在边框上）返回 true ，如果点在多边形外则返回 false
	-------------------------------------------------------------------------- */
	static bool InsidePolygon(int n, Vec2 polygon[], Vec2 point);

	/* --------------------------------------------------------------------------
	函数说明：点与圆的碰撞检测，点p在圆内(包括边界)时
	传入参数：
		o		圆心的坐标
		r		圆的半径
		p		点
	返回值：
		如果点在圆内（包含在圆的边框上）返回 true ，如果点在多边形外则返回 false
	*/
	static bool point_in_circle(Vec2 o, float r, Vec2 p);

	/* --------------------------------------------------------------------------
	函数说明：圆与多边形的碰撞检测，多边形的点在圆内(包括边界)时
	传入参数：
		vcount	多边形的点数的数量
		center		圆心的坐标
		radius		圆的半径
		polygon		多边形的点坐标，是一个数组
	返回值：
		如果点在圆与多边形相交返回 true ，如果点在圆与多边形不相交返回 false
	*/
	static bool CircleInsidePolygon(int vcount, Vec2 center, float radius, Vec2 polygon[]);

	/* --------------------------------------------------------------------------
	函数说明：返回 线段 L1 与 线段L2之间的角度，360度那种角度。
	                   
	传入参数：
		s1	线段1的起点
		e1		线段1的终点
		s2		线段2的起点
		e2		线段2的终点
	返回值：
		返回 线段 L1 与 线段L2之间的角度，360度那种角度
	*/
	static float getAngleInTwoLine(Vec2 s1, Vec2 e1, Vec2 s2, Vec2 e2);
};

#endif
